"""LLM Plays Pokemon 配置管理模块"""

import os
import sys
import json
import logging
from pathlib import Path
from typing import Dict, Any

logger = logging.getLogger(__name__)

# 默认配置
DEFAULT_CONFIG = {
    # 日志配置
    "logging": {
        "level": "INFO",
        "format": "%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s",
        "log_file": "llm_pokemon.log",
    },
    # 模拟器配置
    "emulator": {
        "type": "mgba",  # 模拟器类型
        "rom_path": "",  # ROM文件路径
        "save_state_dir": "save_states",  # 存档目录
        "screenshot_dir": "screenshots",  # 截图目录
    },
    
    # 知识库配置
    "knowledge_base": {
        "storage_path": "knowledge_base.json",  # 知识库存储路径
        "backup_dir": "knowledge_backups",  # 备份目录
        "max_backups": 10,  # 最大备份数量
    },
    
    # 会话管理配置
    "conversation": {
        "max_turns": 50,  # 触发总结的最大对话轮数
        "history_path": "conversation_history.json",  # 会话历史存储路径
    },
    
    # LLM配置
    "llm": {
        "provider": "openai",  # LLM提供商
        "model": "gpt-4",  # 模型名称
        "api_key_env": "OPENAI_API_KEY",  # API密钥环境变量名
        "base_url": "",  # API基础URL，为空则使用默认URL
        "max_tokens": 4096,  # 最大生成令牌数
    },
    
    # 工具配置
    "tools": {
        "navigator": {
            "path_finding_algorithm": "a_star",  # 寻路算法
            "max_path_length": 100,  # 最大路径长度
        },
    },
}


def load_config(config_path: str = "config.json") -> Dict[str, Any]:
    """加载配置文件
    
    Args:
        config_path: 配置文件路径
        
    Returns:
        配置字典
    """
    config = DEFAULT_CONFIG.copy()
    
    # 如果配置文件存在，则加载并合并配置
    if os.path.exists(config_path):
        try:
            with open(config_path, 'r', encoding='utf-8') as f:
                user_config = json.load(f)
                
            # 递归合并配置
            _merge_configs(config, user_config)
            logger.info(f"已加载配置文件: {config_path}")
        except Exception as e:
            logger.error(f"加载配置文件失败: {e}")
            logger.info("使用默认配置")
    else:
        logger.info(f"配置文件不存在: {config_path}，使用默认配置")
        
        # 创建默认配置文件
        try:
            os.makedirs(os.path.dirname(os.path.abspath(config_path)), exist_ok=True)
            with open(config_path, 'w', encoding='utf-8') as f:
                json.dump(DEFAULT_CONFIG, f, indent=2, ensure_ascii=False)
            logger.info(f"已创建默认配置文件: {config_path}")
        except Exception as e:
            logger.error(f"创建默认配置文件失败: {e}")
    
    # 确保必要的目录存在
    _ensure_directories(config)
    
    return config


def _merge_configs(base_config: Dict[str, Any], override_config: Dict[str, Any]) -> None:
    """递归合并配置
    
    Args:
        base_config: 基础配置
        override_config: 覆盖配置
    """
    for key, value in override_config.items():
        if key in base_config and isinstance(base_config[key], dict) and isinstance(value, dict):
            _merge_configs(base_config[key], value)
        else:
            base_config[key] = value


def _ensure_directories(config: Dict[str, Any]) -> None:
    """确保必要的目录存在
    
    Args:
        config: 配置字典
    """
    # 确保模拟器相关目录存在
    os.makedirs(config["emulator"]["save_state_dir"], exist_ok=True)
    os.makedirs(config["emulator"]["screenshot_dir"], exist_ok=True)
    
    # 确保知识库备份目录存在
    os.makedirs(config["knowledge_base"]["backup_dir"], exist_ok=True)
    
    # 确保会话历史目录存在
    history_path = config["conversation"]["history_path"]
    os.makedirs(os.path.dirname(os.path.abspath(history_path)), exist_ok=True)


def setup_logging(config: Dict[str, Any]) -> None:
    """根据配置设置日志系统
    
    Args:
        config: 配置字典
    """
    log_config = config["logging"]
    
    # 设置日志级别
    level = getattr(logging, log_config["level"], logging.INFO)
    
    # 配置日志
    logging.basicConfig(
        level=level,
        format=log_config["format"],
        handlers=[
            logging.StreamHandler(sys.stdout),
            logging.FileHandler(log_config["log_file"])
        ]
    )
    
    logger.info("日志系统已初始化")